package com.czxy.config;

import com.czxy.auth.util.RsaUtils;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.io.File;
import java.security.PrivateKey;
import java.security.PublicKey;

/**
 * 读取yml文件的信息，获取公钥私钥路径，加密的明文，过期的时间
 * @author Liuyunqin 17674029449@163.com
 * @date 2018/12/17 17:10
 */
@Data
@ConfigurationProperties(prefix = "sc.jwt") //扫描文件
@Configuration
public class JwtProperties {
    /**
     * 加密的明文
     */
    private String secret;
    /**
     * 公钥地址
     */
    private String pubKeyPath;
    /**
     * 私钥地址
     */
    private String priKeyPath;
    /**
     * 过期时间,单位分钟
     */
    private Integer expire;

    /**
     * 公钥
     */
    private PublicKey publicKey;

    /**
     * 私钥
     */
    private PrivateKey privateKey;

    private static final Logger logger = LoggerFactory.getLogger(JwtProperties.class);

    /**
     * PostConstruct注解作用的方法，在类加载的时候，会自动执行该方法，初始化里面的信息
     * 在这个方法中，初始化公钥和私钥
     */
    @PostConstruct
    public void init(){
       try {

           //1. 判断公钥和私钥的文件是否已经存在
           File pubFile = new File(pubKeyPath);
           File priFile = new File(priKeyPath);

           //2. 如果不存在，就创建公钥和私钥的文件
           if (!pubFile.exists()||!priFile.exists()) {
               //2.1 生成
               RsaUtils.generateKey(this.pubKeyPath,this.priKeyPath,this.secret);
           }
           //3. 生成公钥和私钥对象
            this.privateKey = RsaUtils.getPrivateKey(priKeyPath);
            this.publicKey = RsaUtils.getPublicKey(pubKeyPath);

       }catch (Exception e){
           logger.error("初始化公钥和私钥失败！", e);
           throw new RuntimeException();
       }

    }


}
